﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using ViewMaker.Core;

namespace ViewMaker
{
    public static class ViewModelExtension
    {
        /// <summary>
        /// メッセージボックスを表示する。
        /// </summary>
        /// <param name="vm">ViewModel</param>
        /// <param name="message">メッセージ</param>
        /// <param name="title">タイトル</param>
        public static void ShowMessage(this ViewModelBase vm, string message, string title = "Message")
        {
            var info = new ShowMessageViewCommandInfo { Title = title, Message = message, Style = MessageBoxStyle.Ok };
            vm.ExecuteViewCommand(ViewCommands.ShowMessage, info);
        }

        /// <summary>
        /// OK・Cancel確認用メッセージボックスを表示する。
        /// </summary>
        /// <param name="vm">ViewModel</param>
        /// <param name="message">メッセージ</param>
        /// <param name="title">タイトル</param>
        /// <returns>OKの場合true,Cancelの場合はfalse</returns>
        public static bool ShowOKCancel(this ViewModelBase vm, string message, string title = "Confirm")
        {
            var info = new ShowMessageViewCommandInfo { Title = title, Message = message, Style = MessageBoxStyle.OkCancel };
            vm.ExecuteViewCommand(ViewCommands.ShowMessage, info);
            return info.Result.Value;
        }

        /// <summary>
        /// ファイルオープン・ダイアログを表示する。
        /// </summary>
        /// <param name="vm">ViewModel</param>
        /// <param name="filter">ファイルフィルター</param>
        /// <returns>オープンしたファイルのStream。ファイルを選択しなかった場合はnull</returns>
        public static Stream ShowOpenFile(this ViewModelBase vm, string filter)
        {
            var info = new SelectFileViewCommandInfo { Filter = filter };
            vm.ExecuteViewCommand(ViewCommands.ShowOpenFile, info);
            return info.FileStream;
        }

        /// <summary>
        /// テキストファイルオープン・ダイアログを表示する。
        /// </summary>
        /// <param name="vm">ViewModel</param>
        /// <param name="filter">ファイルフィルター</param>
        /// <returns>オープンしたファイルのStreamReader。ファイルを選択しなかった場合はnull</returns>
        public static StreamReader ShowOpenTextFile(this ViewModelBase vm, string filter)
        {
            Stream st = null;
            try
            {
                st = ShowOpenFile(vm, filter);
                if (st == null) return null;
                return new StreamReader(st);
            }
            catch
            {
                if (st != null) st.Dispose();
                throw;
            }
        }

        /// <summary>
        /// セーブ・ダイアログを表示する。
        /// </summary>
        /// <param name="vm">ViewModel</param>
        /// <param name="filter">ファイルフィルター</param>
        /// <returns>選択したファイルのStream。ファイルを選択しなかった場合はnull</returns>
        public static Stream ShowSaveFile(this ViewModelBase vm, string filter)
        {
            var info = new SelectFileViewCommandInfo { Filter = filter };
            vm.ExecuteViewCommand(ViewCommands.ShowSaveFile, info);
            return info.FileStream;
        }

        /// <summary>
        /// テキストセーブ・ダイアログを表示する。
        /// </summary>
        /// <param name="vm">ViewModel</param>
        /// <param name="filter">ファイルフィルター</param>
        /// <returns>選択したファイルのStreamWriter。ファイルを選択しなかった場合はnull</returns>
        public static StreamWriter ShowSaveTextFile(this ViewModelBase vm, string filter)
        {
            Stream st = null;
            try
            {
                st = ShowSaveFile(vm, filter);
                if (st == null) return null;
                return new StreamWriter(st);
            }
            catch
            {
                if (st != null) st.Dispose();
                throw;
            }
        }
    }
}
